#include <cstdio>
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <cassert>
using namespace std;

int main()
{
    int fds[2];
    int n = pipe(fds);
    assert(n == 0);
    pid_t id = fork();
    assert(id >= 0);
    if (id == 0)
    {
        close(fds[0]);
        const char *s = "我是子进程，我正在给父进程发消息";
        int cnt = 0;
        while (true)
        {
            cnt++;
            char buffer[1024];
            snprintf(buffer, sizeof(buffer), "子进程说：%s[%d]，pid = [%d]", s, cnt, getpid());
            write(fds[1], buffer, strlen(buffer));
            sleep(1);
        }
        close(fds[1]);
        exit(0);
    }

    close(fds[1]);
    while (true)
    {
        char buffer[1024];
        ssize_t s = read(fds[0], buffer, sizeof(buffer) - 1);
        if (s > 0)
        {
            buffer[s] = 0;
            cout << "Get Message# " << buffer << " | my pid: " << getpid() << endl;
        }
    }

    n = waitpid(id, nullptr, 0);
    assert(n == id);
    close(fds[0]);

    // cout << "n = " << ((n > 8) & 0xFF) << endl;
    // cout << "fds[0] = "<<fds[0]<<endl;
    // cout << "fds[1] = "<<fds[1]<<endl;
    return 0;
}

// int main()
// {
//     // 第一步：创建管道文件，打开读写端
//     int fds[2];
//     int n = pipe(fds);
//     assert(n == 0);

//     // 第二步: fork
//     pid_t id = fork();
//     assert(id >= 0);
//     if (id == 0)
//     {
//         // 子进程进行写入
//         close(fds[0]);
//         // 子进程的通信代码
//         // string msg = "hello , i am child";
//         const char *s = "我是子进程,我正在给你发消息";
//         int cnt = 0;
//         while (true)
//         {
//             cnt++;
//             char buffer[1024]; // 只有子进程能看到！
//             snprintf(buffer, sizeof buffer, "child->parent say: %s[%d][%d]", s, cnt, getpid());
//             write(fds[1], buffer, strlen(buffer));
//             sleep(1);
//         }

//         // 子进程
//         close(fds[1]); // 子进程关闭写端fd
//         cout << "子进程关闭自己的写端" << endl;
//         exit(0);
//     }
//     // 父进程进行读取
//     close(fds[1]);
//     // 父进程的通信代码
//     while (true)
//     {
//         char buffer[1024];
//         ssize_t s = read(fds[0], buffer, sizeof(buffer) - 1);
//         if (s > 0)
//         {
//             buffer[s] = 0;
//             cout << "Get Message# " << buffer << " | my pid: " << getpid() << endl;
//         }
//         // 细节：父进程可没有进行sleep
//         // sleep(5);
//     }
//     close(fds[0]);
//     cout << "父进程关闭读端" << endl;

//     int status = 0;
//     n = waitpid(id, &status, 0);
//     assert(n == id);

//     return 0;
// }
